# conding = utf-8
import yaml
from selenium.common import NoSuchElementException
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver import ActionChains


class Page:
    '''
    所有页面都会继承的类，里面封装了页面的所有操作
    '''

    def __init__(self, driver: WebDriver):
        self.driver = driver
        self.chains = ActionChains(driver)

    def find_element(self, args):
        '''
        :param args: 是两个参数，第一个是定位方式，第二个是定位元素的位置
        :return: 返回定位元素
        '''
        return self.driver.find_element(*args)

    def is_exists(self, args):
        '''
        判别元素是否存在
        :param args:
        :return:
        '''
        eles = self.driver.find_elements(*args)
        if len(eles) > 0:
            return True
        else:
            return False

    def is_exists_count(self, args):
        '''
        判别元素是否存在
        :param args:
        :return:
        '''
        eles = self.driver.find_elements(*args)
        return len(eles)

    def find_element_wait(self, args):
        '''
        设置显示等待去获取元素
        :param args: 是两个参数，第一个是定位方式，第二个是定位元素的位置
        :return: 返回定位元素
        '''
        return WebDriverWait(self.driver, 30, 0.5) \
            .until(lambda driver: driver.find_element(*args))

    def send_keys(self, args, value):
        '''
        元素输入
        :param value:
        :param args:
        :return:
        '''
        el = self.find_element(args)  # 查找元素
        el.clear()  # 清空元素
        if isinstance(value, str) and "random" in value:
            value = eval(value)
        el.send_keys(value)  # 输入

    def send_file(self, args, value):
        '''
        输入文件内容
        :param value:
        :param args:
        :return:
        '''
        el = self.find_element(args)  # 查找元素
        el.send_keys(value)  # 输入

    def click(self, args):
        '''
        元素单击处理
        :param args:
        :return:
        '''
        el = self.find_element(args)
        el.click()

    def text(self, args):
        '''
        获取页面元素中的文本内容
        :param args:
        :return:
        '''
        el = self.find_element(args)
        return el.text

    def get_input_value(self, args):
        '''
        获取输入框的值
        :param args:
        :return:
        '''
        input_element = self.find_element(args)
        return input_element.get_attribute("value")

    def point_text(self, args, value):
        '''
        获取页面元素中的文本内容
        :param value:
        :param args:
        :return:
        '''
        a, b = args  # 解包
        b = b % value  # 格式化字符串
        c = a, b  # 组合成元组
        el = self.find_element(c)
        return el.text

    def url(self):
        return self.driver.current_url

    def display(self, args):
        '''
        元素是否隐藏
        :param args:
        :return:
        '''
        try:
            el = self.find_element(args)
            return True  # 如果找到元素，返回 True
        except NoSuchElementException:
            return False

    def clear(self, args):
        '''
        清除
        :param args:
        :return:
        '''
        el = self.find_element(args)
        el.clear()

    def move_element(self, args):
        '''
        移动到指定元素
        :param args:
        :return:
        '''
        el = self.find_element(args)
        self.chains.move_to_element(el).click().perform()

    def find_elements(self, args):
        '''
        :param args: 是两个参数，第一个是定位方式，第二个是定位元素的位置
        :return: 返回多个定位元素
        '''
        return self.driver.find_elements(*args)

    def refresh(self):
        self.driver.refresh()


